﻿using System;
using System.Web.Mvc;
using Contact.DAL.Models.Worktime;
using ContactMvc4TB.Helpers.HelperClasses;
using EFDataModel;
using GlobalResources;
using System.Linq;

namespace ContactMvc4TB.Models.Worktime
{
    public class DeleteWorktimeEntryModel
    {
        #region Helper Properties
        /// <summary>
        /// Der Aktuelle CurrentController um hier auch Messages ausgeben zu können.
        /// </summary>
        private Controller Controller { get; set; }
        #endregion

        #region Konstruktor
        public DeleteWorktimeEntryModel(Controller controller)
        {
            Controller = controller;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Löschen des übergebenen Arbeitszeiteintrags
        /// </summary>
        /// <param name="worktimeEntryId">Der Arbeitszeiteintrag der gelöscht werden soll</param>
        /// <param name="userId">die UserId dzu dem der arbeitszeiteintrag gehört.</param>
        /// <returns>Gibt das Datum des Eintrags zurück der gelöscht werden soll.</returns>
        public DateTime DeleteWorktimeEntry(long worktimeEntryId, long userId)
        {
            WorktimeRepository repository = new WorktimeRepository(CurrentHttpContext.GetDataModel());
            //Laden des passenden Worktime entries, um dann die Arbeitszeiten für den Tag anpassen zu können.
            EFWorktimeEntry entry = repository.GetWorktimeEntry(userId, worktimeEntryId);
            if (entry != null)
            {
                //Die passende Worktime dazu laden.
                EFWorktime worktime = entry.EFWorktime;
                EWorktimeType type = entry.WorkingtimeType;
                if (repository.DeleteWorktimeEntry(worktimeEntryId))
                {
                    //Wenn es sich bei dem Eintrag der gelöscht werden soll um den Offiziellen Feiertag handelt, dann muss hier geprüft werden ob noch weitere Offizielle Feiertage für
                    //den aktuellen Eintrag angelegt wurden und wenn nicht, dann für den Eintrag den Feiertagsstatus entfernen.
                    if (type == EWorktimeType.OfficalHoliday && worktime.EFWorktimeEntry.Count(p => p.WorkingtimeType == EWorktimeType.OfficalHoliday) == 1)
                    {
                        worktime.IsLegalHoliday = false;
                    }

                    //Nach dem Der Eintrag erfolgreich gelöscht wurde muss das Worktime Objekt angepasst werden mit den Zeiten.
                    //TODO Prüfen ob beim Löschen auch die Krankheitsdaten und Co mit beachtet werden.
                    TimeManagement.TimeManagement.Management(worktime, CurrentHttpContext.GetDataModel()).RecalculateTimeEntries(type);
                    if (repository.SaveWorktimeEntry(worktime))
                    {
                        CustomMessage.CurrentMessage(Controller).AddMessage(SystemMessages.WorktimeEntryDeleteSuccess, MessageTypes.ok);
                        return worktime.EntryDate;
                    }
                    else
                    {
                        //Es ist ein Fehler beim Speichern des worktimeeintrags aufgetreten.
                        CustomMessage.CurrentMessage(Controller).AddMessage(SystemMessages.WorktimeSaveError, MessageTypes.error);
                    }
                }
            }

            CustomMessage.CurrentMessage(Controller).AddMessage(SystemMessages.WorktimeEntryDeleteError, MessageTypes.error);
            return DateTime.Now.Date;
        }
        #endregion
    }
}